home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / iconv8_s.arc / ICONT.ARC / LGLOB.C < prev    next >
C/C++ Source or Header  |  1990-03-28  |  4KB  |  113 lines

  1. /*
  2.  * lgloc.c -- routines for processing .u2 files.
  3.  */
  4.  
  5. #include "..\h\config.h"
  6. #include "general.h"
  7. #include "tproto.h"
  8. #include "link.h"
  9. #include "opcode.h"
  10. #include "..\h\version.h"
  11.  
  12. int nrecords = 0;        /* number of records in program */
  13.  
  14. /*
  15.  * readglob reads the global information from infile (.u2) and merges it with
  16.  *  the global table and record table.
  17.  */
  18. novalue readglob()
  19.    {
  20.    register char *id;
  21.    register int n, op;
  22.    int k;
  23.    int implicit;
  24.    char *name;
  25.    struct gentry *gp;
  26.    extern char *progname;
  27.  
  28.    if (getopc(&name) != Op_Version)
  29.       quitf("ucode file %s has no version identification",inname);
  30.    id = getid();        /* get version number of ucode */
  31.    newline();
  32.    if (strcmp(id,UVersion)) {
  33.       fprintf(stderr,"version mismatch in ucode file %s\n",inname);
  34.       fprintf(stderr,"\tucode version: %s\n",id);
  35.       fprintf(stderr,"\texpected version: %s\n",UVersion);
  36.  
  37.       exit(ErrorExit);
  38.  
  39.       }
  40.    while ((op = getopc(&name)) != EOF) {
  41.       switch (op) {
  42.          case Op_Record:    /* a record declaration */
  43.             id = getid();    /* record name */
  44.             n = getdec();    /* number of fields */
  45.             newline();
  46.             gp = glocate(id);
  47.             /*
  48.              * It's ok if the name isn't already in use or if the
  49.              *  name is just used in a "global" declaration.  Otherwise,
  50.              *  it is an inconsistent redeclaration.
  51.              */
  52.             if (gp == NULL || (gp->g_flag & ~F_Global) == 0) {
  53.                putglobal(id, F_Record, n, ++nrecords);
  54.                while (n--) {    /* loop reading field numbers and names */
  55.                   k = getdec();
  56.                   putfield(getid(), nrecords, k);
  57.                   newline();
  58.                   }
  59.                }
  60.             else {
  61.                lfatal(id, "inconsistent redeclaration");
  62.                while (n--)
  63.                   newline();
  64.                }
  65.             break;
  66.  
  67.          case Op_Impl:        /* undeclared identifiers should be noted */
  68.             if (getopc(&name) == Op_Local)
  69.                implicit = 0;
  70.             else
  71.                implicit = F_ImpError;
  72.             break;
  73.  
  74.          case Op_Trace:        /* turn on tracing */
  75.             trace = -1;
  76.             break;
  77.  
  78.          case Op_Global:    /* global variable declarations */
  79.             n = getdec();    /* number of global declarations */
  80.             newline();
  81.             while (n--) {    /* process each declaration */
  82.                getdec();    /* throw away sequence number */
  83.                k = getoct();    /* get flags */
  84.                if (k & (F_Proc & ~F_Global))
  85.                   k |= implicit;
  86.                id = getid();    /* get variable name */
  87.                gp = glocate(id);
  88.                /*
  89.                 * Check for conflicting declarations and install the
  90.                 *  variable.
  91.                 */
  92.                if (gp != NULL &&
  93.                    (k & (F_Proc & ~F_Global)) && gp->g_flag != F_Global)
  94.                   lfatal(id, "inconsistent redeclaration");
  95.                else if (gp == NULL || (k & (F_Proc & ~F_Global)))
  96.                   putglobal(id, k, getdec(), 0);
  97.                newline();
  98.                }
  99.             break;
  100.  
  101.          case Op_Link:        /* link the named file */
  102.             name = getrest();    /* get the name and */
  103. /*          name = getstr();    /* get the name and */
  104.             alsolink(name);    /*  put it on the list of files to link */
  105.             newline();
  106.             break;
  107.  
  108.          default:
  109.         quitf("ill-formed global file %s",inname);
  110.          }
  111.       }
  112.    }
  113.